<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 不同的二叉搜索树-dp解法
    // 1. dp[i] i个不同节点组成的二叉搜索树的个数
    // 2. dp[i] = dp[j - 1] * dp[i - j]，i从1-n循环，j从1-i循环 ==> 比如dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + d[0] * dp[2]
    // dp[3]的数量由3为根节点的数量+2为根节点的数量加上,1为根节点的数量
    // 根节点为3的数量就是dp[2] * dp[0]，右子树的数量为dp[2]，左子树的数量为0
    // 3. 初始化dp[0]需要为0，空节点不仅是二叉树也是二叉搜索树
    // 4. 递推顺序: 从前往后，
    // 5. 举例如上面的3
    let numTrees = function(n) {
      let dp = new Array(n + 1).fill(0)
      dp[0] = 1
      for (let i = 1; i <= n; i++) {
        for (let j = 1; j <= i; j++) {
          dp[i] += dp[j - 1] * dp[i - j]
        }
      }
      return dp[n]
    };
    console.log(numTrees(3));
    console.log(numTrees(4));
    
  </script>
</body>

</html>